home *** CD-ROM | disk | FTP | other *** search
/ The Best of MacTutor - S…e Code for Volumes 1 to 5 / The Best of MacTutor - Source Code for Volume 1-5 (Wayzata Technology)(6031)(1990).bin / Source Code / #33 (Jun 88) / Fkey Source Files / FkeyTemp.Asm < prev    next >
Assembly Source File  |  1988-05-19  |  14KB  |  498 lines

  1. ;File:   FkeyTemp.Asm
  2. ;-------------------------------------------------
  3. ;An Fkey sampler Fkey
  4. ;By John Holder    2/8/87
  5. ;Revised            3/29/88
  6. ;-------------------------------------------------
  7.     Include    Traps.D
  8.     Include    Toolequ.D
  9.     Include    Sysequ.D
  10.  
  11. ;-------------------------------------------------
  12. ;Macros to save & restore the registers
  13. ;-------------------------------------------------
  14. MACRO    SaveRegs    =
  15.     movem.l    A0-A4/D0-D7,-(SP)
  16.     |
  17.  
  18. MACRO    RestoreRegs =
  19.     movem.l    (SP)+,A0-A4/D0-D7
  20.     |
  21.  
  22. ;-------------------------------------------------
  23. ;All equates go here
  24. ;-------------------------------------------------
  25. ;these are offsets into the global storage.
  26. ;(a non-relocatable block we created pointed to by A4)
  27. ;-------------------------------------------------
  28. sfReply        equ    0    ;sfreply record
  29. GetVRef        equ    6
  30. GetVers        equ    8
  31. GFileName    equ    10
  32. IOParamBlk    equ    76    ;IOparamblock (80 bytes)
  33. WindPtr        equ    156    ;for our background                     ;window
  34. EventBlk    equ    160    ;Event Block
  35. what         equ    160    ;Event number
  36. message        equ    162    ;Additional information
  37. when        equ    166    ;Time event was posted 
  38. where        equ    170    ;Mouse coordinates
  39. modify        equ    174    ;State of keys and button
  40. wWindow        equ    176    ;Window pointer
  41. Menu1Hndl    equ    180    ;handle to our Apple menu
  42. Menu2Hndl    equ    184    ;handle to our File menu
  43. oldMenuBar    equ    188    ;handle to applications                     ;menu
  44. TheWindow    equ    192    ;for _FindWindow
  45.  
  46. ;event masks for _GetOSEvent
  47. mDownMask    equ    2
  48. keyDownMask    equ    8
  49.  
  50. ;Menu equates
  51. AppleMenu    equ    1    ;Apple Menu
  52. AboutItem    equ    1    
  53. FileMenu    equ    2    ;File Menu
  54. OpenFkeyItem    equ    1
  55. QuitItem    equ    3
  56.  
  57. ;------------------------------------------------
  58. ;All FKEY's must have this FKEY resource header!
  59. ;-------------------------------------------------
  60.     bra.s    StartIt        ;branch over header
  61.     dc    0        ;flags (not used)
  62.     dc.b    'FKEY'        ;resource type
  63.     dc    9        ;Resource ID #
  64.     dc    0        ;version # (not used)
  65. ;-------------------------------------------------
  66. StartIt
  67.     SaveRegs            ;save regs MACRO
  68.     subq    #4,SP
  69.     move.l    SP,-(SP)
  70.     _GetPort            ;save Port for later
  71.     _InitCursor            ;standard arrow cursor
  72.  
  73.     ;does application have a menu???  if not, then quit!
  74.     move.l    MenuList,D0
  75.     beq    NoMenuJump        ;no menu, beep & quit!
  76.  
  77.     move.l    #200,D0            ;200 bytes of storage
  78.     _NewPtr,CLEAR            ;for our globals
  79.     move.l    A0,A4            ;pointer in A4
  80.     cmp.l    #0,A4
  81.     bne.s    StorageOk        ;if not zero, ptr is ok!
  82.  
  83. NoMenuJump
  84.     bsr    Mem_Error        ;otherwise beep
  85.     bra    No_Mem            ;and quit
  86.     
  87. StorageOk
  88.     bsr    SetUpMenus        ;set up our menus
  89.     bsr    SetUpWindow        ;set up background                     ;window
  90. ;-------------------------------------------------
  91. MainLoop                ;standard event loop
  92.     _SystemTask
  93.         clr    -(SP)
  94.     move     #$0FFF,-(SP)        ;event mask
  95.     pea    EventBlk(A4)        ;Place to return results
  96.     _GetNextEvent            ;Look for an event
  97.     move    (SP)+,D2        
  98.     beq    MainLoop        ;zero if we shouldn't
  99.     move    What(A4),D0        ;respond
  100.     add    D0,D0
  101.     move    EventTable(D0),D0
  102.     jmp    EventTable(D0)        ;jump to appropriate                     ;routine
  103.  
  104. EventTable
  105.     dc    MainLoop-EventTable    ;null event
  106.     dc    MouseDown-EventTable      ;mouse down
  107.     dc    MainLoop-EventTable    ;mouse up
  108.     dc    KeyDown-EventTable    ;key down
  109.     dc    MainLoop-EventTable    ;key up
  110.     dc    KeyDown-EventTable    ;auto key
  111.     dc    UpDateJump-EventTable      ;update event
  112.     dc    MainLoop-EventTable    ;disk event
  113.     dc    MainLoop-EventTable    ;activate event
  114.     dc    MainLoop-EventTable    ;abort
  115.     dc    MainLoop-EventTable    ;network event
  116.     dc    MainLoop-EventTable    ;I/O driver event
  117.  
  118. ;-------------------------------------------------
  119. SetUpWindow
  120.     clr.l    -(SP)            ;for returned pointer
  121.     clr.l    -(SP)            ;let Mac make storage
  122.     pea    WindowRect        ;windows rectangle
  123.     clr.l    -(SP)            ;no title
  124.     move.b    #1,-(SP)        ;it is visible
  125.     move    #plainDBox,-(SP)    ;Type of window
  126.     move.l    #-1,-(SP)        ;in front
  127.     move.b    #0,-(SP)        ;no close box
  128.     clr.l    -(SP)            ;refcon zero
  129.     _NewWindow            ;make window!
  130.     move.l    (SP),WindPtr(a4)     ;pointer into global
  131.     _SetPort            ;set as the port
  132.     rts
  133.  
  134. ;-------------------------------------------------
  135. SetUpMenus
  136.     clr.l    -(SP)            ;get applications menu
  137.     _GetMenuBar            ;bar handle for later
  138.     move.l    (SP)+,oldMenuBar(A4)     ;restoration!
  139.     _ClearMenuBar            ;clear Apps menu bar
  140.  
  141. ;make all of our menus
  142. ;the apple menu    
  143.     clr.l    -(SP)        
  144.     move    #1,-(SP)
  145.     pea    AppleSymbol
  146.     _NewMenu
  147.     move.l    (SP)+,Menu1Hndl(A4)
  148.     move.l    Menu1Hndl(A4),-(sp)
  149.     pea    'About Fkey Sampler...'
  150.     _AppendMenu
  151.     move.l    Menu1Hndl(A4),-(sp)    
  152.     move    #2,-(SP)        
  153.     _InsertMenu
  154. ;the File menu
  155.     clr.l    -(SP)
  156.     move    #2,-(SP)
  157.     pea    'File'
  158.     _NewMenu
  159.     move.l    (SP)+,Menu2Hndl(A4)
  160.     move.l    Menu2Hndl(A4),-(sp)
  161.     pea    'Open FKEY/F'
  162.     _AppendMenu        
  163.     move.l    Menu2Hndl(A4),-(sp)
  164.     pea    '(-'
  165.     _AppendMenu        
  166.     move.l    Menu2Hndl(A4),-(sp)
  167.     pea    'Quit/Q'
  168.     _AppendMenu        
  169.     move.l    Menu2Hndl(A4),-(sp)    
  170.     clr    -(SP)
  171.     _InsertMenu
  172.     _DrawMenuBar            ;draw the new menu bar
  173.     rts
  174.  
  175. UpDateJump
  176.     bsr    UpDateWindow        
  177.     bra    MainLoop
  178.  
  179. ;-------------------------------------------------
  180. ;This routine keeps our background window (The DeskTop!) 
  181. ;the same pattern as the current standard desktop!
  182. ;-------------------------------------------------
  183. UpDateWindow
  184.     move.l    WindPtr(A4),-(SP)       ;our background                     ;window
  185.     _BeginUpdate            ;is kept in WindPtr(A4)
  186.     move.l    WindPtr(A4),-(SP)
  187.     _SetPort
  188.     pea    PaintRect        ;the rectangle to paint
  189.     pea    DeskPattern        ;global var, contains
  190.     _FillRect            ;pattern used for desktop    
  191.     move.l    WindPtr(A4),-(SP)
  192.     _EndUpdate
  193.     rts
  194.  
  195. ;-------------------------------------------------
  196. ;A key down event occured, check if the command key was 
  197. ;down, if not, get the next event!
  198. ;-------------------------------------------------
  199. KeyDown
  200.     move    Modify(A4),D1
  201.     btst    #8,D1            ;check command key bit
  202.     beq    MainLoop        ;zero if command key
  203.                     ;is not down!
  204.     clr.l    -(sp)
  205.     move    message+2(A4),-(sp)      ;put char onto stack
  206.     _MenuKey            ; for _MenuKey
  207.     move.l    (sp)+,D4        ;put result in D4
  208.     beq    MainLoop        ;if zero, no menu                     ;equivalent
  209.     bra    WhatMenu
  210.  
  211. ;-------------------------------------------------
  212. ;A mousedown event occured, we only check if its in a menu, if 
  213. ;not then get the next event!
  214. ;-------------------------------------------------
  215. MouseDown
  216.     clr    -(SP)            ;word result
  217.     move.l    where(A4),-(SP)      ;where field of                     ;event record
  218.     pea    TheWindow(A4)        ;returns the window                     ;pntr the
  219.     _FindWindow            ;mouse was clicked in, 
  220.     move    (SP)+,D0        ;if it was in one.
  221.  
  222.     add    D0,D0
  223.     move    WindowTable(D0),D0
  224.     jmp    WindowTable(D0)        ;jump to appropriate                     ;routine
  225.  
  226. ;We only use InMenu event!
  227. WindowTable
  228.     dc    MainLoop-WindowTable      ;In Desk
  229.     dc    InMenu-WindowTable      ;In Menu Bar
  230.     dc    MainLoop-WindowTable      ;In System Window
  231.     dc    MainLoop-WindowTable      ;in Content
  232.     dc    MainLoop-WindowTable      ;in drag
  233.     dc    MainLoop-WindowTable      ;in grow
  234.     dc    MainLoop-WindowTable      ;in go away
  235.  
  236. ;-------------------------------------------------
  237. ;The mouse was clicked in the menu bar.
  238. ;-------------------------------------------------
  239. InMenu
  240.     clr.l    -(SP)
  241.     move.l    where(A4),-(SP)
  242.     _MenuSelect
  243.     move.l    (SP)+,D4
  244.     beq    MainLoop        ;zero if no item selected
  245.  
  246. ;jump to here after command key down event
  247. WhatMenu    
  248.     move.l    D4,D6            ;D6 will now have the
  249.     swap    D4            ; item # D4 will have                     ;menu #
  250. WhichMenuWasIt
  251.     cmp    #AppleMenu,D4        ;is it in the apple menu?
  252.     beq    InAppleMenu        ;if so, go see which                     ;item!
  253.     cmp    #FileMenu,D4        ;is it in the File menu?
  254.     beq    InFileMenu
  255.     bra    MainLoop        ;where else could it be!
  256.  
  257. InAppleMenu                ;in the "Apple" menu
  258.     cmp    #AboutItem,D6
  259.     beq    DoAbout            ;its in the About... Item!
  260.     bra    MainLoop
  261.  
  262. InFileMenu                ;in the "File" menu
  263.     cmp    #OpenFkeyItem,D6     ;in the OpenFkey Item?
  264.     beq    Open_Fkey        ;if so go open it!
  265.     cmp    #QuitItem,D6        ;Quit item?
  266.     beq    QuitRoutine        ;if so go quit
  267.     bra    MainLoop
  268.  
  269. ;-------------------------------------------------
  270. ;Show the "About Fkey Sampler..." window
  271. ;-------------------------------------------------
  272. DoAbout
  273.     saveregs            ;save the registers
  274.     
  275.     clr.l    -(SP)
  276.     clr.l    -(SP)        
  277.     pea    AboutRect        
  278.     move.l    #0,-(SP)    
  279.     move.b    #1,-(SP)
  280.     move    #1,-(SP)
  281.     move.l    #-1,-(SP)
  282.     move.b    #0,-(SP)
  283.     clr.l    -(SP)
  284.     _NewWindow        ;make a window
  285.     move.l    (SP),A2    ;put pointer into A2
  286.     _SetPort            ;make it the port
  287.  
  288.     move    #Monaco,-(SP)    ;Use the Monaco Font
  289.     _TextFont            
  290.     move    #9,-(SP)        ;make it 9 point (size)
  291.     _TextSize
  292.  
  293.     pea    MyTextBegin    ;address of "About" Text                    
  294.  
  295. ;calculate how many chars in text for TextBox
  296.     move.l    #MyTextEnd-MyTextBegin,-(SP)
  297.     pea    TextRect        ;rectangle for text
  298.     move    #1,-(SP)        ;center justification
  299.     _TextBox
  300.     bsr    Wait_For_Event        ;wait for button/key down
  301.     move.l    A2,-(SP)
  302.     _DisposWindow            ;get rid of the window
  303.     bsr    UnHiliteIt        ;go unhilight the menu!
  304.     move.l    WindPtr(A4),-(sp)
  305.     _SetPort            ;reset our old port
  306.     restoreregs            ;restore registers
  307.     bra    MainLoop        ;go get another event
  308.  
  309. ;-------------------------------------------------
  310. ;Wait for mouse or key down event
  311. ;-------------------------------------------------
  312. Wait_For_Event
  313.     link    A6,#-evtBlkSize        ;link, event block size
  314. WaitLoop    
  315.     lea    -evtBlkSize(A6),A0     ;ptr to event block in A0
  316.     moveq    #mDownMask!KeyDownMask,D0 ;Event masks in D0
  317.     _GetOSEvent
  318.     beq    Clicked            ;if zero, time to leave!
  319.     bra    WaitLoop        ;loop until event
  320. Clicked                    ;mouse or key clicked!
  321.     unlk    A6            ;unlink A6
  322.     rts
  323.     
  324. ;-------------------------------------------------
  325. ;Quitting, dispose of all our storage and menus and return to 
  326. ;the application that the Fkey was called from!
  327. ;-------------------------------------------------
  328. QuitRoutine
  329.     move.l    WindPtr(A4),-(SP)          ;dump background 
  330.     _DisposWindow            ;window
  331.     move.l    Menu1Hndl(A4),-(SP)      ;dump our #1 
  332.     _DisposMenu                        ;menu
  333.     move.l    Menu2Hndl(A4),-(SP)     ;dump our #2
  334.     _DisposMenu                 ;menu
  335.     _ClearMenuBar            ;clear the menu
  336.     move.l    oldMenuBar(A4),-(SP)
  337.     _SetMenuBar            ;restore apps menu bar!
  338.     move.l    oldMenuBar(A4),A0      ;dump copy of    
  339.     _DisposHandle             ;apps menu handle!
  340.     _DrawMenuBar            ;draw it
  341.     move.l    A4,A0
  342.     _DisposPtr            ;dump our global                     ;storage
  343.  
  344. No_Mem
  345.     move.l    #$0000FFFF,D0          ;flush all events
  346.     _FlushEvents
  347.     _SetPort            ;set original port!
  348.     restoreregs            ;restore the registers
  349.     rts                ;return to the application!
  350.  
  351. ;-------------------------------------------------
  352. ;Couldn't allocate space for our global storage area
  353. ;just beep & quit!
  354. ;-------------------------------------------------
  355. Mem_Error
  356.     move    #10,-(SP)
  357.     _SysBeep
  358.     rts
  359.  
  360. ;-------------------------------------------------
  361. ;Unhilight menu bar after mouse down in a menu item
  362. ;-------------------------------------------------
  363. UnHiliteIt
  364.     move    #0,-(SP)
  365.     _HiliteMenu
  366.     rts
  367.  
  368. ;-------------------------------------------------
  369. ;Get a file of type "FKEY", open its resource fork, and
  370. ;execute the Fkey (if there is one) contained in it!
  371. ;-------------------------------------------------
  372. Open_Fkey
  373.     saveregs            ;save registers
  374.     move    #82,-(SP)        ;coordinates for GetFile
  375.     move    #100,-(SP)        ;dialog box    
  376.     clr.l    -(SP)            ;prompt
  377.     clr.l    -(SP)            ;File Filter Proc Pointer
  378.     move    #1,-(SP)        ;number of file types
  379.     pea    TypeList        ;our type list
  380.     clr.l    -(SP)            ;Dialog Hook Proc Pointer
  381.     pea    sfReply(A4)        ;sfreply record
  382.     move    #2,-(SP)        ;#2 for SFGetFile
  383.     _Pack3                ;Call the Get File Pack
  384.     cmp.b    #0,sfReply(A4)
  385.     beq    Cancel            ;if user hit cancel, quit!
  386.  
  387.     bsr    UpDateWindow        ;update window before
  388.                     ;opening the Fkey
  389.     lea    IOParamBlk(A4),A2    ;the IO param block
  390.     clr.l    12(A2)            ;zero "ioCompletion"
  391.     lea    GFileName(A4),A0     ;put a pointer to the files
  392.     move.l    A0,18(A2)        ;name into "ioNamePtr"
  393.     move    GetVRef(A4),22(A2)     ;"ioVRefNum"
  394.     move.l    A2,A0           ;put param block ptr in A0
  395.     _SetVol                ;set as current volume
  396.  
  397.     clr    -(SP)            ;space for refnum
  398.     pea    GFileName(A4)        ;name of res file to open
  399.     _OpenResFile            ;Open that resource file
  400.     move    (SP)+,D7        ;put result in D7
  401.     cmp    #-1,D7            ;will be -1 if any
  402.                     ;errors!
  403.     beq    Cancel            ;if error go to cancel
  404.  
  405. ;this stops resources from being loaded with GetIndResource,
  406. ;GetResource or GetNamedResource
  407.     move.w        #0,-(sp)
  408.     _SetResLoad
  409.  
  410.     clr.l        -(sp)
  411.     move.l    #'FKEY',-(sp)
  412.     move    #1,-(sp)
  413.     _GetIndResource            ;get first FKEY resource
  414.     move.l    (sp)+,A3        ;handle into A3
  415.  
  416. ;Turns Automatic resource loading back on!
  417.     move.b        #1,-(sp)
  418.     _SetResLoad
  419.  
  420.     clr.l        -(sp)
  421.     move.l        A3,-(sp)
  422.     _SizeRsrc
  423.     move.l        (sp)+,D2    ;how big is the resource?
  424.     cmp.l        #-1,D2        ;-1 = no resource
  425.     beq        NotEnoughMem    ;no resource error so quit
  426.  
  427. ;do we have enough memory to load the FKEY    
  428.     move.l        D2,D0
  429.     _NewHandle
  430.     move.l        A0,A1
  431.     cmp.l        #0,A1        ;was zero returned?
  432.     beq        NotEnoughMem    ;not enough room, so quit!
  433.     _DisposHandle            ;otherwise dispose the new
  434.                     ;handle, and go on..
  435.     move.l    A3,-(sp)
  436.     _LoadResource            ;Load resource into memory!
  437.     clr    -(sp)
  438.     move.l    A3,-(SP)
  439.     _HomeResFile            ;what resource file
  440.     move    (sp)+,D2        ;is this resource from?
  441.  
  442.     cmp    D2,D7            ;is it from new file?
  443.     beq    YepItsFromNewFile    ;yep!
  444.     bra    NotEnoughMem        ;if not, close the res
  445.                     ;file and quit!
  446. YepItsFromNewFile
  447.     move.l    A3,A0
  448.     _Hlock                ;Lock it before jumping to it
  449.     move.l    (A3),A2             ;put pointer to FKEY in A2
  450.     SaveRegs            ;save the regs
  451.     jsr    (A2)            ;Run the Fkey!!
  452.     RestoreRegs            ;restore the regs
  453.     move.l    A3,A0
  454.     _HUnlock            ;UnLock FKEY handle
  455.     bsr    CloseIt            ;go close res file
  456.  
  457. Cancel
  458.     restoreregs            ;restore the regs
  459.     bsr    UnHiliteIt        ;unhilight the menu
  460.     bra    MainLoop        ;get the next event
  461.  
  462.  
  463. NotEnoughMem
  464.     bsr    CloseIt
  465.     bra    Cancel
  466.  
  467. CloseIt
  468.     move    D7,-(SP)
  469.     _CloseResFile            ;Close the res file
  470.     rts
  471.  
  472. ;-------------------------------------------------
  473. ;All constants go here
  474. ;-------------------------------------------------
  475. ;rect of background (desktop) window
  476. ;make it giant to cover entire background!
  477. WindowRect    dc    0,0,4000,4000
  478.  
  479. PaintRect    dc    0,0,4000,4000
  480.  
  481. TypeList    dc.b    'FKEY'
  482.         .ALIGN    2
  483.  
  484. ;rect of "About..." window
  485. AboutRect    dc    130,100,190,412
  486.  
  487. ;rect text will be displayed in for _TextBox
  488. TextRect    dc    10,10,90,302
  489.  
  490. AppleSymbol    dc.b    1,$14    ;apple symbol for menu #1
  491.         .ALIGN    2
  492.  
  493. MyTextBegin    dc.b    'Fkey Sampler 1.0',$0D,$0D
  494.         dc.b    'Written by John Holder'
  495.         .ALIGN    2
  496. MyTextEnd
  497.  
  498.     END